import { createI18n } from 'vue-i18n';

// 导入原始语言文件
import zhMessages from './locales/zh';
import enMessages from './locales/en';
import esMessages from './locales/es';
import frMessages from './locales/fr';

// 创建修复版本的语言对象 - 处理任何可能的语法问题
const fixedMessages = {
  zh: {
    ...zhMessages,
    // 添加任何特定的修复，覆盖原始值
  },
  en: {
    ...enMessages,
    // 添加任何特定的修复，覆盖原始值
  },
  es: {
    ...esMessages,
    // 添加任何特定的修复
    // 如果是扁平结构，需要处理为嵌套结构
    basicInfo: {
      title: esMessages['basicInfo.title'] || "Información Básica",
      name: esMessages['basicInfo.name'] || "Nombre",
      phone: esMessages['basicInfo.phone'] || "Teléfono",
      goods: esMessages['basicInfo.goods'] || "Artículos",
      address: esMessages['basicInfo.address'] || "Dirección"
    }
  },
  fr: {
    ...frMessages,
    // 添加任何特定的修复
    // 如果是扁平结构，需要处理为嵌套结构
    basicInfo: {
      title: frMessages['basicInfo.title'] || "Informations de Base",
      name: frMessages['basicInfo.name'] || "Nom",
      phone: frMessages['basicInfo.phone'] || "Téléphone",
      goods: frMessages['basicInfo.goods'] || "Articles",
      address: frMessages['basicInfo.address'] || "Adresse"
    }
  }
};

// 导出所有支持的语言代码
export function getSupportedLocales() {
  return ['zh', 'en', 'es', 'fr'];
}

// 检测用户的首选语言
export function detectLanguage() {
  // 获取URL参数中的语言设置（最高优先级）
  if (typeof window !== 'undefined') {
    const urlParams = new URLSearchParams(window.location.search);
    const langParam = urlParams.get('lang');
    if (langParam && getSupportedLocales().includes(langParam)) {
      console.log('使用URL参数中的语言设置:', langParam);
      return langParam;
    }
  }

  // 其次检查localStorage
  const storedLang = localStorage.getItem('userLanguage');
  if (storedLang && getSupportedLocales().includes(storedLang)) {
    console.log('使用存储的语言设置:', storedLang);
    return storedLang;
  }

  // 获取浏览器语言设置
  const lang = navigator.language.split('-')[0];

  // 检查是否为支持的语言,不支持则默认英文
  if (getSupportedLocales().includes(lang)) {
    console.log('检测到浏览器语言:', lang);
    return lang;
  }

  console.log('不支持的语言,使用英文作为默认值:', lang);
  return 'en'; // 默认英文
}

// 创建扁平版本的语言对象 - 帮助诊断嵌套对象问题
export function flattenMessages(messages: any, prefix = '') {
  return Object.keys(messages).reduce((acc, key) => {
    const prefixedKey = prefix ? `${prefix}.${key}` : key;
    if (typeof messages[key] === 'object' && messages[key] !== null) {
      Object.assign(acc, flattenMessages(messages[key], prefixedKey));
    } else {
      acc[prefixedKey] = messages[key];
    }
    return acc;
  }, {} as Record<string, string>);
}

// 确保语言对象加载完整 - 替换缺失或错误的消息
function ensureMessages(messages: any) {
  // 确保title至少存在
  if (!messages.title) {
    messages.title = '预约系统';
  }

  // 确保basicInfo对象存在并且至少有title属性
  if (!messages.basicInfo || typeof messages.basicInfo !== 'object') {
    messages.basicInfo = { title: '基本信息' };
  } else if (!messages.basicInfo.title) {
    messages.basicInfo.title = '基本信息';
  }

  return messages;
}

// 改进的语言设置函数
export function setLocale(locale: string) {
  if (!getSupportedLocales().includes(locale)) {
    console.error('不支持的语言:', locale);
    return false;
  }

  console.log('设置语言为:', locale);

  // 使用更安全的方式设置语言
  try {
    // 安全类型转换
    const typedLocale = locale as 'zh' | 'en' | 'es' | 'fr';
    i18n.global.locale.value = typedLocale;
    localStorage.setItem('userLanguage', locale);

    // 触发语言改变事件
    window.dispatchEvent(new CustomEvent('locale-changed', {
      detail: { locale }
    }));

    return true;
  } catch (error) {
    console.error('设置语言时出错:', error);
    return false;
  }
}

// 构建完整的消息对象 - 确保每种语言都有相同的键
const zhSafe = ensureMessages(fixedMessages.zh);
const enSafe = ensureMessages(fixedMessages.en);
const esSafe = ensureMessages(fixedMessages.es);
const frSafe = ensureMessages(fixedMessages.fr);

// 确保兼容扁平结构和嵌套结构
const messages = {
  zh: zhSafe,
  en: enSafe,
  es: esSafe,
  fr: frSafe
};

// 打印加载的消息示例
console.log('默认语言(zh)翻译示例:', messages.zh ? messages.zh.title : '未找到zh语言文件');

// 创建扁平化版本用于调试
export const flatMessages = {
  zh: flattenMessages(messages.zh),
  en: flattenMessages(messages.en),
  es: flattenMessages(messages.es),
  fr: flattenMessages(messages.fr)
};

// 在window上暴露扁平化的语言对象用于调试
if (typeof window !== 'undefined') {
  // @ts-ignore
  window.__i18n_flat_messages = flatMessages;

  // 添加调试帮助函数
  // @ts-ignore
  window.__i18n_helper = {
    getLocale: () => i18n.global.locale.value,
    setLocale,
    getSupportedLocales: () => getSupportedLocales(),
    getMessages: () => i18n.global.messages.value,
    getFlatMessages: () => flatMessages,
    // 用于检测插值语法错误
    checkSyntax: (locale: string, key: string) => {
      try {
        // 尝试渲染消息，看是否有语法错误
        const msg = i18n.global.t(key);
        return {
          success: true,
          message: msg,
          locale,
          key
        };
      } catch (error) {
        return {
          success: false,
          error: String(error),
          locale,
          key
        };
      }
    }
  };
}

// 创建i18n实例
const i18n = createI18n({
  legacy: false,  // 使用Composition API模式
  locale: detectLanguage(),
  fallbackLocale: 'en',
  messages,
  // 在生产环境中保留消息格式错误的警告
  warnHtmlMessage: true,
  missingWarn: true,
  fallbackWarn: true,
  // 尝试容错处理，避免语法错误导致整个应用崩溃
  silentTranslationWarn: false,
  silentFallbackWarn: false,
  formatFallbackMessages: true
});

// 检查i18n加载状态
console.log('i18n已初始化:',
  '可用语言:', i18n.global.availableLocales,
  '当前语言:', i18n.global.locale.value
);

export default i18n; 